# -*- coding: utf-8 -*-

import numpy as np
np.random.seed(1337) # for reproducibility
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from tensorflow.keras.optimizers import RMSprop

# download the mnist to the path '~/.keras/dattasets/' if it is the first time to be called
# X shape (60,000 28x28), y shape (60,000,)
(X_train, y_train), (X_test, y_test) = mnist.load_data()

print('X_train.shape=',X_train.shape) # X_train.shape= (60000, 28, 28)
print('y_train.shape=',y_train.shape) # y_train.shape= (60000,)


# data pre-processing
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize
y_train = np_utils.to_categorical(y_train, num_classes = 10)
y_test = np_utils.to_categorical(y_test, num_classes = 10)

print('X_train.shape=',X_train.shape) # X_train.shape= (60000, 784)
print('y_train.shape=',y_train.shape) # y_train.shape= (60000, 10)

# Another way to build your neural net
model = Sequential([
        Dense(32, input_dim=784),
        Activation('relu'),
        Dense(10),
        Activation('softmax')
        ])


# Anther way to define your optimizer
rmsprop = RMSprop(learning_rate=0.001, rho=0.9, epsilon=1e-08, decay=0.0)

# We add metrics to get more results you want to see
model.compile(
        optimizer = rmsprop,
        loss='categorical_crossentropy',
        metrics=['accuracy']
    )

print('Training ----------')
# Another way to train the model
model.fit(X_train, y_train, epochs=1, batch_size=32)

print('\nTesting ----------')
# Evaluate the model with the metrics we defined
loss, accuracy = model.evaluate(X_test, y_test)

print('test loss: ', loss) # test loss:  0.2355789840221405
print('test accruracy: ', accuracy) # test accruracy:  0.9340000152587891